<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>

        // Iterator 迭代器
        /*
            iterator 属性，内部做了一些功能，如果数据自带这个东西，那么可以使用
                for ... of 的方式遍历和枚举
                还可以使用 next 方法手动枚举
        */

        // *** 不是所有能被 for...of 的数据，都能调用 next 方法

        // 1. 字符串
        // const str = 'hello world.';
        // const str = new String('hello world.');
        // console.log(str.next());
        // for (const item of str) {
        //     console.log(item);
        // }

        // 2. 数组
        const arr = [4, 5, 6, 7, 8];
        // for (const item of arr) {
        //     console.log(item);
        // }
        // console.log(arr);

        // 可以返回一个 Iterator 接口
        // 默认有两个属性, value: 对应的值， done: 是否取值完毕
        const keys = arr.keys(); // 0 1 2 3 4

        // console.log(keys.next());
        // console.log(keys.next());
        // console.log(keys.next());
        // console.log(keys.next());
        // console.log(keys.next());
        // console.log(keys.next());

        // 返回iterator接口的取值方式，遍历方式
        // do {
        //     var item = keys.next();
        //     if (item && item.value !== undefined) {
        //         // console.log(item);
        //         console.log(item.value);
        //     }
        // } while (!item.done)

        // 3. Set 
        const data = new Set(['a', 'b', 'c', 'x', 'a']);
        // for (const item of data) {
        //     console.log(item);
        // }
        // console.log(data);

        // 获取所有的值
        // const vals = data.keys();
        // console.log(vals);
        // do {
        //     var item = vals.next();
        //     if (item && item.value !== undefined) {
        //         console.log(item);
        //         console.log(item.value);
        //     }
        // } while (!item.done)

        // 4. Map 数据
        function fn() { }
        const datas = new Map([
            [true, 123],
            [undefined, 'abc'],
            [fn, 'ok']
        ])
        // for (const item of datas) {
        //     console.log(item);
        // }
        const entries = datas.entries();
        console.log(entries);
        // for (const item of entries) {
        //     console.log(item);
        // }

        // do {
        //     var item = entries.next();
        //     if (item && item.value !== undefined) {
        //         console.log(item);
        //         console.log(item.value);
        //     }
        // } while (!item.done)


        // 5. 对象
        const obj = {
            a: 10,
            b: 20
        }
        // obj is not iterable
        // for (const item of obj) { }

        // console.log(Object.keys(obj));
        // console.log(Object.values(obj));
    </script>
</body>

</html>